Clojure-এ Atom, Ref, এবং Agent হল তিনটি মূল কনসেপ্ট যা ডেটা ম্যানেজমেন্ট এবং কনকারেন্ট প্রোগ্রামিংয়ের জন্য ব্যবহৃত হয়। এই তিনটি কনসেপ্ট মূলত মিউটেবল স্টেট (mutable state) এবং কনকারেন্ট প্রোগ্রামিংকে দক্ষভাবে পরিচালনা করতে সাহায্য করে। Clojure-এ ডেটা ইমিউটেবল, কিন্তু এই তিনটি কনসেপ্ট ব্যবহার করে আপনি কনকারেন্ট সিস্টেমে ডেটার নিরাপত্তা নিশ্চিত করতে পারেন।
Atom হল একটি মিউটেবল (mutable) ডেটা কাঠামো যা একমাত্র এক থ্রেডের মাধ্যমে পরির্বতিত হতে পারে, তবে এটি অনেক বেশি সুবিধাজনক যখন আপনি ডেটা সমন্বয় (coordination) করতে চান যেখানে আপনি শুধুমাত্র একটি থ্রেডের মাধ্যমে ডেটার পরিবর্তন করবেন।
Atom-এর মূল বৈশিষ্ট্য হলো এটি নিরাপদভাবে একাধিক থ্রেডে পরিবর্তন করা যায়। এটমের প্রতিটি পরিবর্তন একটি "সোয়াপ" (swap) এর মাধ্যমে ঘটে, এবং আপনি নিশ্চিত থাকেন যে একাধিক থ্রেড একই সময়ে একই অ্যাটম পরিবর্তন করতে পারবে না।
(def my-atom (atom initial-value))
Atom
ব্যবহার(def my-atom (atom 0))
; অ্যাটমের মান পরিবর্তন করা
(swap! my-atom inc) ; আউটপুট: 1
; অ্যাটমের বর্তমান মান পড়া
@my-atom ; আউটপুট: 1
এখানে, swap!
ফাংশনটি অ্যাটমের মান পরিবর্তন করতে ব্যবহৃত হয়। @my-atom
দ্বারা আমরা অ্যাটমের মান পড়তে পারি।
Ref হল এমন একটি ডেটা কাঠামো যা ট্রানজ্যাকশনাল মেমোরি মডেল (STM) ব্যবহার করে। যখন আপনি একাধিক থ্রেডের মধ্যে একসাথে ডেটার পরিবর্তন চান, তখন Ref ব্যবহৃত হয়। এটি একটি মিউটেবল ডেটা রেফারেন্স যা dosync
ব্লক ব্যবহার করে একাধিক থ্রেডের মধ্যে সুরক্ষিতভাবে পরিবর্তন করা যায়।
Ref মূলত সিক্যুয়েন্সের মধ্যে কনসিস্টেন্ট (consistent) স্টেট বজায় রাখতে ব্যবহৃত হয়।
(def my-ref (ref initial-value))
Ref
ব্যবহার(def my-ref (ref 0))
; ট্রানজ্যাকশনাল ব্লকে মান পরিবর্তন করা
(dosync
(alter my-ref inc))
; রেফের মান পড়া
@my-ref ; আউটপুট: 1
এখানে, dosync
একটি ট্রানজ্যাকশনাল ব্লক শুরু করে, যেখানে alter
ফাংশনটি my-ref
এর মান পরিবর্তন করে।
Agent হল এমন একটি কনসেপ্ট যা অ্যাসিঙ্ক্রোনাস ডেটা ম্যানেজমেন্টের জন্য ব্যবহৃত হয়। এটি প্রক্রিয়া করে ডেটাকে পরিবর্তন করার জন্য পৃথক থ্রেড ব্যবহার করে। একটি এজেন্টের মান পরিবর্তন করতে আপনি একটি অ্যাসিঙ্ক্রোনাস ফাংশন ব্যবহার করেন, যা অ্যাজেন্টকে কোড পরিবর্তনের জন্য অ্যাকশন (action) পাঠায়।
এজেন্ট ব্যবহার করার সময়, আপনার কোড থ্রেড ব্লক বা ব্লকিং ছাড়া কার্যকরী হতে পারে, কারণ এটি অ্যাসিঙ্ক্রোনাস পদ্ধতিতে কাজ করে।
(def my-agent (agent initial-value))
Agent
ব্যবহার(def my-agent (agent 0))
; অ্যাসিঙ্ক্রোনাসভাবে মান পরিবর্তন করা
(send my-agent inc)
; অ্যাজেন্টের মান পড়া
@my-agent ; আউটপুট: 1 (যেহেতু এটি অ্যাসিঙ্ক্রোনাস, এক্সিকিউশন শেষে মান পরিবর্তিত হবে)
এখানে, send
ফাংশনটি অ্যাসিঙ্ক্রোনাসভাবে এজেন্টের মান পরিবর্তন করতে ব্যবহৃত হয়।
বৈশিষ্ট্য | Atom | Ref | Agent |
---|---|---|---|
সামঞ্জস্য | একক থ্রেডে সুরক্ষা (atomic) | ট্রানজ্যাকশনাল মেমোরি (STM) | অ্যাসিঙ্ক্রোনাস, থ্রেড ব্লকিং ছাড়া |
ব্যবহার | একক থ্রেডে মান পরিবর্তন | একাধিক থ্রেডে মান পরিবর্তন এবং সুরক্ষা | দীর্ঘস্থায়ী অ্যাসিঙ্ক্রোনাস অপারেশন |
মান পরিবর্তন | swap! , reset! | alter , ref-set | send , send-off |
প্রতিক্রিয়া | দ্রুত, সরাসরি পরিবর্তন | একটি সিঙ্ক্রোনাস ট্রানজ্যাকশন প্রক্রিয়া | আসিঙ্ক্রোনাসভাবে ডেটা পরিবর্তন |
সামাজিক ব্যবহার | ছোট, সহজ পরিবর্তন | বড় ডেটা কাঠামো এবং সিক্যুয়েন্স পরিচালনা | বাইরের প্রক্রিয়া বা পরবর্তী অপারেশনগুলো |
swap!
এবং reset!
ব্যবহার হয়।এই তিনটি কনসেপ্ট Clojure-এ কনকারেন্ট প্রোগ্রামিংয়ের সময় ডেটার নিরাপত্তা এবং কার্যকারিতা নিশ্চিত করতে সাহায্য করে, এবং বিভিন্ন পরিস্থিতিতে আপনার ডেটা ম্যানিপুলেশন প্রয়োজন অনুসারে এগুলো ব্যবহার করা যেতে পারে।
common.read_more